/**
 * Decorator Pattern
 *    --Attaches additional responsibilities to an object dynamically.
 *    --Decorators provide a flexible alternative to subclassing for extending functionality.
 *    --装饰者模式可以动态地给一个对象增加其他职责。
 *    --就扩展对象功能来说，装饰者模式比生成子类更为灵活。
 *    --Client specified embellishment of a core object by recursively wrapping it.
 *    --Wrapping a gift, putting it in a box and wrapping the box.
 *    体现了一个设计原则：Favor composition over inheritance.（优先使用对象组合，而非类继承）
 * 
 * Decorator定义:
 *    动态给一个对象添加一些额外的职责，就象在墙上刷油漆。
 *    使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
 * 那么动态地给一个对象添加一些额外的职责是不是一定就是Decorator
 * 
 * 为什么使用Decorator?
 *    通常可以使用继承来实现功能的拓展，如果这些需要拓展的功能的种类很繁多， 那么势必生成很多子类，增加系统的复杂性，
 *    同时，使用继承实现功能拓展，我们必须可预见这些拓展功能，这些功能是编译时就确定了，是静态的。
 *    
 * 使用Decorator的理由是:
 *    这些功能需要由用户动态决定加入的方式和时机。
 *    Decorator提供了"即插即用"的方法，在运行期间决定何时增加何种功能。
 *    
 * @author MIAO
 * Created on 2011-10-12
 * For more information, please visit:ismiao.com
 */
package com.ismiao.designPattern.Decorator;

public class DecoratorDesc {
/**
 * 这里只有一个地方需要特殊强调一下：
 *    Decorator是装饰者模式里非常特殊的一个类，它既继承于Component【IS A关系】，
 *    又维护一个指向Component实例的引用【HAS A关系】，换个角度来说，
 *    Decorator跟Component之间，既有动态组合关系又有静态继承关系，WHY? 这里为什么要这么来设计？
 *    上面我们说过，组合的好处是可以在运行时给对象增加职责，
 *    Decorator【HAS A】Component的目的是让ConcreteDecorator可以在运行时动态给ConcreteComponent增加职责，这一点相对来说还比较好理解；
 *    那么Decorator继承于Component的目的是什么？在这里，继承的目的只有一个，那就是可以统一装饰者和被装饰者的接口，
 *    换个角度来说，不管是ConcretComponent还是ConcreteDecorator，它们都是 Component，用户代码可以把它们统一看作Component来处理，
 *    这样带来的更深一层的好处就是，装饰者对象对被装饰者对象的功能职责扩展对用户代码来说是完全透明的，
 *    因为用户代码引用的都是Component，所以就不会因为被装饰者对象在被装饰后，引用它的用户代码发生错误，实际上不会有任何影响，
 *    因为装饰前后，用户代码引用的都是Component类型的对象，这真是太完美了！
 *    装饰者模式通过继承实现统一了装饰者和被装饰者的接口，通过组合获得了在运行时动态扩展被装饰者对象的能力。
 * 
 * 
 * Decorator设计模式与Adapter设计模式的区别：
 *    Both the Adapter and Decorator patterns involve objects that are wrappers for other objects. 
 *    The basic intent of the Adapter pattern is to adapt an object to an interface that we do not implement. 
 *    The basic intent of the Decorator pattern is to extend the behavior of objects. 
 *    This difference in intent is sometimes the clearest way to distinguish between the two.
 */
}
